package com.lanhai.webservice.netty;

import com.lanhai.webservice.entity.WebLogInfo;
import com.lanhai.webservice.proxy.IService1Proxy;
import com.lanhai.webservice.service.WebLogInfoService;
import com.lanhai.webservice.utils.StringUtil;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.socket.DatagramPacket;

import java.net.InetSocketAddress;
import java.util.*;
import java.util.concurrent.*;

import org.apache.catalina.Executor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;


/**
 * 1.自定义一个handler需要继承netty规定好的某个handlerAdapter(规范)
 * 2.这时我们自定义的handler才能称为一个handler
 */
@Component
public class NettyServeHandler extends SimpleChannelInboundHandler<DatagramPacket> {

    private static final String LINETYPE_PERFIX = "L";
    private static final String WORKSHOP_PERFIX = "J31";

    @Autowired
    private WebLogInfoService webLogInfoService;

    @Autowired
    private ThreadPoolExecutor myExecutor;

    //读取数据实际(这里我们可以读取客户端发送的消息)

    /**
     * 1.ChannelHanderCopntext ctx:上下文对象，含有 管道pipline ，通道channel ，地址
     * 2.Object msg:客户端发送的数据 默认Objeck
     *
     * @param ctx
     * @param packet
     * @throws Exception
     */
    @Override
    public void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) {

        String id = UUID.randomUUID().toString();
        String[] arrRFID = new String[11];
        //取出传输数据
        for (int i = 0; i < packet.content().readableBytes(); i++) {
            byte aByte = packet.content().getByte(i);
            //防止下标越界
            if (i <= 10) {
                //下标为2特殊情况需要从10进制由ascii表得出结果
                if (i == 2) {
                    Integer integer = Integer.valueOf(aByte & 0xff);
                    char c = (char) integer.intValue();
                    arrRFID[i] = String.valueOf(c);
                } else {
                    Integer integer = Integer.valueOf(aByte & 0xff);
                    arrRFID[i] = String.valueOf(integer.intValue());
                }
                System.out.print("下标为:" + i + "的解析....");
                System.out.println(arrRFID[i]);
            }

        }


        InetSocketAddress remoteAddress = packet.sender();
        String ip = remoteAddress.getAddress().getHostAddress();
        int port = remoteAddress.getPort();
        System.out.println(ip + ":" + port);

        //处理线别: 线别是由下标10和2组成
        arrRFID[2] = LINETYPE_PERFIX + arrRFID[10] + arrRFID[2];

        //处理车间号 因为设备传递过来503需要有两个字节组成所以只传输了一个字节的3过来需要拼一个50
        arrRFID[0] = WORKSHOP_PERFIX ;

        //调用接口的参数 因为原数组有11位不符合参数要求10位
        String[] resarray = new String[10];
        for (int i = 0; i < arrRFID.length - 1; i++) {
            resarray[i] = arrRFID[i];
        }


        //判断是否调用接口  前五个参数不能为空
//        boolean flag = Arrays.asList(arrRFID).stream().limit(4).allMatch(item -> !Objects.equals(item, "0"));
        String message = "";

        //调用webservice接口  线程池异步调用 （netty是nio居然会阻塞我凌乱了） 异步调用后再更新日志数据
        myExecutor.execute(() -> {
            IService1Proxy iService1Proxy = new IService1Proxy();
            String anyflag = "0";
            String anymessage = "";
            try {

                String[] strings = iService1Proxy.sendRFIDInfoToMES(resarray);
                //返回结果
                System.out.print("远程webservice接口结果->");
                Arrays.asList(strings).forEach(System.out::print);
                anyflag = Objects.equals("True", strings[0]) ? "0" : "1";
                anymessage = strings[1];
            } catch (Exception e) {
                anyflag = "1";
                //记录信息 防止字段过长
                anymessage = "远程webservice调用失败->" +
                        (e.getMessage().length() > 900 ? e.getMessage().substring(0, 900) : e.getMessage());
            }

            webLogInfoService.update(id, anyflag, anymessage);
        });


        //组装实体类
        WebLogInfo webLogInfo = new WebLogInfo();
        webLogInfo.setId(id);
        webLogInfo.setIp(ip);
        webLogInfo.setPort(port + "");
        webLogInfo.setWorkshop(arrRFID[0]);
        webLogInfo.setAssemblyLine(arrRFID[1]);
        webLogInfo.setLinetype(arrRFID[2]);
        webLogInfo.setBin(arrRFID[3]);
        webLogInfo.setProcedurenum(Integer.parseInt(arrRFID[4]));
        webLogInfo.setCreateTime(new Date());
        webLogInfo.setIssuccee(StringUtil.isNotBlank(message) ? "1" : "0");
        webLogInfo.setMessage(message);
        //将数据存入数据库
        webLogInfoService.insert(webLogInfo);
    }


    //处理异常 ,不做处理，如通道关闭则不能监听
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        System.out.println("连接异常关闭");
        //ctx.close();
    }

}

